import { login, logout, getInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import mapButtonObj from '@/utils/mapButton'
import router, {
  resetRouter,
  allAsyncRoutes,
  constantRoutes,
  anyRoute
} from '@/router'

import cloneDeep from 'lodash/cloneDeep'
// 有父级过滤过滤出来的路由
const filterRoutes=(allAsyncRoutes,routesNames)=>{
 let asyncRoutes= allAsyncRoutes.filter(item=>{
    // 如果第一级路由找到了则要
    if(routesNames.indexOf(item.name)!==-1){
    //  判断是否有子路由
      if(item.children&& item.children.length>0){
        filterRoutes(item.children,routesNames)
      }
      return true
    }
    // 没有进入到if则过滤掉
    return false
  })
  return asyncRoutes

}
// 这个版本是不根据父级，过滤出子
// const filterRoutes = (allAsyncRoutes, routesNames) => {
//   let asyncRoutes = allAsyncRoutes.filter(item => {
//     // 如果第一级路由没有找到
//     if (routesNames.indexOf(item.name) === -1) {
//       //  判断是否有子路由
//       if (item.children && item.children.length > 0) {
//         //使用匹配的子路由信息替换当前子路由信息
//         item.children = filterRoutes(item.children, routesNames)
//         //如果匹配子路由信息不为空，返回
//         if (item.children.length > 0) {
//           return true
//         }
//       }
//       //  return false
//     } else {
//       //  找到了
//       // 父路由组件不返回
//       return true
//     }
//   })
//   return asyncRoutes
// }
const getDefaultState = () => {
  return {
    token: getToken(),
    name: '',
    avatar: '',
    routes: '', //全部的路由表，常量路由+异步路由表+404路由表
    asyncRoutes: '' //用户全部的异步路由表
  }
}

const state = getDefaultState()

const mutations = {
  RESET_STATE: state => {
    Object.assign(state, getDefaultState())
  },
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  // SET_NAME: (state, name) => {
  //   state.name = name;
  // },
  // SET_AVATAR: (state, avatar) => {
  //   state.avatar = avatar;
  // }
  SET_USER_INFO(state, user) {
    state.name = user.name
    state.avatar = user.avatar
    state.buttons = user.buttons
  },
  // vuex中保存一份路由
  SET_ROUTES(state, { routes, buttons }) {
    // 按钮权限管理
    // 1。把bottom转换给对象，用对象的值读取，性能更好
    // 2.写一个自定义指令，判断是否有这个权限，如果有则显示，没有直接删掉这个bottom
    state.buttonsObj = mapButtonObj(buttons)
    console.log('state.buttonsObj', state.buttonsObj)
    let asyncRoutes = filterRoutes(cloneDeep(allAsyncRoutes), routes)
    console.log("asyncRoutes",asyncRoutes)
    // 所有的用户异步权限路由表
    state.asyncRoutes = asyncRoutes
    // 全部的路由表
    state.routes = constantRoutes.concat(asyncRoutes, anyRoute)
    // console.log('routes', state.routes)

    // 当前路由器目前还是常量路由表，动态的添加异步路由表
    router.addRoutes([...asyncRoutes, anyRoute])
  }
}

const actions = {
  // user login
  login({ commit }, userInfo) {
    const { username, password } = userInfo
    return new Promise((resolve, reject) => {
      login(username, password)
        .then(response => {
          // 2.保存在vuex中
          commit('SET_TOKEN', response.token)
          // 3.还保存在Cookies中
          setToken(response.token)
          resolve()
        })
        .catch(error => {
          reject(error)
        })
    })
  },

  // get user info
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo(state.token)
        .then(response => {
          if (!response) {
            return reject('Verification failed, please Login again.')
          }

          // const { name, avatar, buttons,routes} = response
          // 保存用户数据
          // commit("SET_NAME", name);
          // 保存用户的信息
          commit('SET_USER_INFO', response)
          // console.log('response',response)
          // 生成权限菜单，
          // 所有的权限菜单（当前所有路由allAsyncRoutes） 和 当前用户拥有的权限值列表(response.routes)
          // 对权限菜单进行过滤，最终得到用户可以访问的权限菜单(定义一个方法)
          //过滤等到用户的路由表
          // let userRoutes = filterRoutes(
          //   cloneDeep(allAsyncRoutes),
          //   response.routes
          // )
          const { buttons, routes } = response
          // console.log('allAsyncRoutes', allAsyncRoutes)
          // console.log('response.routes', response.routes)

          commit('SET_ROUTES', { routes, buttons })
          resolve(response)
        })
        .catch(error => {
          reject(error)
        })
    })
  },

  // user logout
  logout({ commit, state }) {
    return new Promise((resolve, reject) => {
      logout(state.token)
        .then(() => {
          removeToken() // must remove  token  first
          resetRouter()
          commit('RESET_STATE')
          resolve()
        })
        .catch(error => {
          reject(error)
        })
    })
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
